home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / diskdup / diskdup.c < prev    next >
Text File  |  1993-07-08  |  25KB  |  1,102 lines

  1. /********************************************************************
  2.  *                                                                    *
  3.  *                            DISKDUP                            *
  4.  *                                                                    *
  5.  *                        オンメモリ型 DISKCOPY                        *
  6.  *                                                                    *
  7.  *                            diskdup.exp                                *
  8.  *                                                                    *
  9.  *                            for FM-TOWNS                            *
  10.  *                                                                    *
  11.  *            Copyright (c) ちにゃと & Tymic 1992. 1993.        *
  12.  *                                                                    *
  13.  *                            メイン ソース                            *
  14.  *                                                                    *
  15.  ********************************************************************/
  16.  
  17. #define    __PRGMAIN__                /* ファイル ID */
  18.  
  19. /********************************************************************
  20.     インクルードファイル
  21. *********************************************************************/
  22.  
  23. /* HI-C ライブラリ ヘッダー */
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <conio.h>
  28. #include <dos.h>
  29.  
  30. /* T-BIOS C ライブラリ ヘッダー */
  31. #include <fmcfrb.h>
  32.  
  33. /* ソース ヘッダー */
  34. #include "diskdup.h"
  35. #include "ddupgui.h"
  36. #include "option.h"
  37.  
  38. /********************************************************************
  39.     変数
  40. *********************************************************************/
  41.  
  42. char Title1[] = "DiskDup Ver "VER;
  43. char Title2[] = "Copyright (C) ちにゃと&TYMIC 1992.1993.";
  44.  
  45. char fname[256];        /* char fname <- サイズ指定なし? */
  46. int flagld;
  47. int flagsv;
  48. int flagfmt;
  49. int flagipt;
  50. int flagerr;
  51. int option;
  52. char Headdata[32];
  53.  
  54.  
  55. static char InMstAMsg[] = "マスターディスクをAドライブにセットして下さい";
  56. static char InCpyAMsg[] = "コピーディスクをAドライブにセットして下さい";
  57. static char InCpyBMsg[] = "コピーディスクをBドライブにセットして下さい";
  58. static char FormProcMsg[] = "フォーマットをしながらコピーを行います";
  59. static char EndMsg[] = "終了します";
  60.  
  61. char *ErrMsgTbl[] = {            /* エラー メッセージ テーブル */
  62.     "",
  63.     "モード設定エラーが発生しました",
  64.     "読み込みエラーが発生しました",
  65.     "書き込みエラーが発生しました",
  66.     "ドライブエラーが発生しました",
  67.     "未対応のディスクです",
  68.     "ドライブの準備が出来ていません",
  69.     "書き込み禁止のためコピー出来ません",
  70.     "フォーマットでエラーが発生しました",
  71. };
  72.  
  73.      
  74. static char *DiskTypeMsgTbl[] = {    /* ディスク タイプ メッセージ テーブル */
  75.     "",
  76.     "1・2M 2HD 読み込み中",
  77.     "720k 2DD 読み込み中",
  78.     "640k 2DD 読み込み中",
  79. };
  80.  
  81. static char *DiskData;                /* ディスク 読み込み バッファ ポインタ */
  82. static char FormDataBuf[1024*11];    /* フォーマット データ バッファ */
  83.  
  84. static uint ChkMode1Tbl[] = {    /* セクタ ID 読み込み用 mode1 データ テーブル */
  85.     0x03,                        /* MFM 2HD 1024 */
  86.     0x12,                        /* MFM 2DD  512 */
  87.     0x80,                        /*  FM 2HD  128 */
  88.     0x90,                        /*  FM 2DD  128 */
  89. };
  90. #define    ChkMode1Tbl_Size        sizeof( ChkMode1Tbl ) / sizeof( uint )
  91.  
  92. static FORMPARA  PreAmbl[] = {    /* プレ アンブル 圧縮 データ */
  93.     0x4E, 80,                    /* GAP0 */
  94.     0x00, 12,                    /* SYNC */
  95.     0xF6, 3,                    /* INDEX MARK 1 */
  96.     0xFC, 1,                    /* INDEX MARK 2 */
  97.     0x4E, 50,                    /* GAP1 */
  98. };
  99. #define PreAmblCnt                sizeof( PreAmbl ) / sizeof( FORMPARA )
  100.  
  101. static FORMPARA  PosAmbl[] = {    /* ポスト アンブル 圧縮 データ */
  102.     0x4E, 600,                    /* GAP4 */
  103. };
  104. #define PosAmblCnt                sizeof( PosAmbl ) / sizeof( FORMPARA )
  105.  
  106. static FORMPARA  SecData1024[] = {    /* 1024 セクタ 圧縮 データ */
  107.     0x00, 12,                    /* SYNC */
  108.     0xF5, 3,                    /* AM1_1 */
  109.     0xFE, 1,                    /* AM1_2 */
  110.     0x00, 1,                    /* ID TRACK NUMBER */
  111.     0x00, 1,                    /* ID SIDE NUMBER */
  112.     0x00, 1,                    /* ID SECTOR NUMBER */
  113.     0x03, 1,                    /* ID SECTOR LENGTH */
  114.     0xF7, 1,                    /* CRC */
  115.     0x4E, 22,                    /* GAP2 */
  116.     0x00, 12,                    /* SYNC */
  117.     0xF5, 3,                    /* AM2_1 */
  118.     0xFB, 1,                    /* AM2_2 */
  119.     0xE5, 1024,                    /* DATA */
  120.     0xF7, 1,                    /* CRC */
  121.     0x4E, 116,                    /* GAP3 */
  122. };
  123. #define SecData1024Cnt            sizeof( SecData1024 ) / sizeof( FORMPARA )
  124.  
  125. static FORMPARA  SecData512[] = {    /* 512 セクタ 圧縮 データ */
  126.     0x00, 12,                    /* SYNC */
  127.     0xF5, 3,                    /* AM1_1 */
  128.     0xFE, 1,                    /* AM1_2 */
  129.     0x00, 1,                    /* ID TRACK NUMBER */
  130.     0x00, 1,                    /* ID SIDE NUMBER */
  131.     0x00, 1,                    /* ID SECTOR NUMBER */
  132.     0x02, 1,                    /* ID SECTOR LENGTH */
  133.     0xF7, 1,                    /* CRC */
  134.     0x4E, 22,                    /* GAP2 */
  135.     0x00, 12,                    /* SYNC */
  136.     0xF5, 3,                    /* AM2_1 */
  137.     0xFB, 1,                    /* AM2_2 */
  138.     0xE5, 512,                    /* DATA */
  139.     0xF7, 1,                    /* CRC */
  140.     0x4E, 116,                    /* GAP3 */
  141. };
  142.  
  143. static int FormatFlg = TRUE;    /* フォーマット 実行 フラグ */
  144. int            disktype=0;        /* ディスク タイプ */
  145.  
  146.  
  147. /************************************************************************
  148. 【メイン処理】
  149.  
  150.         概要    メイン 関数
  151.         用法    無し
  152.         引数    無し
  153.         戻り値    無し
  154.         注意    メモリ アロケート 後の プロセス 脱出は PrgExit1 関数を使用
  155. ************************************************************************/
  156.  
  157. void main( int argc, char *argv[] )
  158. {
  159.     union REGS        regs;
  160.     struct SREGS    sregs;
  161.  
  162.     /* GUI 初期設定 及び タイトル 表示 */
  163.     setscreen();
  164.     putworkbox();
  165.  
  166.     /* forRBIOS 常駐 チェック */
  167.     if ( FRB_getstatus() != 0 ) {
  168.         flagerr=1;
  169.         strcpy( str, "forRBIOSが組み込まれていません" );
  170.         putmessage();
  171.         ready();
  172.         flagerr=0;
  173.         PrgExit2();
  174.     }
  175.  
  176.     /* 共用 メモリ 容量 チェック */
  177.     /* L2.0 T-MENU で長い パラメータ 指定すると */
  178.     /* セグメント データ が ダミー だと ダメ! */
  179.     /* だから保護のため現在の セグメント レジスタ を読込む */
  180.     _segread( &sregs );            /* *** これを追加 *** */
  181.     regs.x.ax = 0x250d;
  182.     _int86x( 0x21, ®s, ®s, &sregs );
  183.     if ( regs.x.cx < sizeof( FormDataBuf ) ) {
  184.         flagerr=1;
  185.         strcpy( str, "ごめんなさいリアルメモリ不足です" );
  186.         putmessage();
  187.         ready();
  188.         flagerr=0;
  189.         PrgExit2();
  190.     }
  191.  
  192.     /* メモリ アロケ-ション */
  193.     if ( ( DiskData = (char *)malloc( DISKSIZE ) ) == NULL ) {
  194.         flagerr=1;
  195.         strcpy( str, "ごめんなさいメモリ不足です" );
  196.         putmessage();
  197.         ready();
  198.         flagerr=0;
  199.         PrgExit2();
  200.     }
  201.     option=optionset( argc,argv );
  202.     if ( option==-1 )
  203.         {
  204.         flagerr=1;
  205.         strcpy( str, "オプションが違います。" );
  206.         putmessage();
  207.         ready();
  208.         option=-2;
  209.         }
  210.  
  211.     if ( option & 1 )
  212.         {
  213.         if (option & 2 )
  214.             {
  215.             flagerr=1;
  216.             strcpy( str, "デ-タファイルの読み込みと作成が同時に指定されました" );
  217.                putmessage();
  218.             ready();
  219.             PrgExit1();    /* メモリアロケーションを使っているから終了はこの関数を通してね */
  220.             }
  221.         }
  222.  
  223.     if (option==-2 )
  224.         {
  225.         flagerr=1;
  226.             strcpy( str, HelpM1 );
  227.             putmessage();
  228.             ready();
  229.             strcpy( str, HelpM2 );
  230.             putmessage();
  231.             ready();
  232.             strcpy( str, HelpM3 );
  233.             putmessage();
  234.             ready();
  235.             strcpy( str, HelpM4 );
  236.             putmessage();
  237.             ready();
  238.             strcpy( str, HelpM5 );
  239.             putmessage();
  240.             ready();
  241.             strcpy( str, HelpM6 );
  242.             putmessage();
  243.             ready();
  244.             strcpy( str, HelpM7 );
  245.             putmessage();
  246.             ready();
  247.             strcpy( str, HelpM8 );
  248.             putmessage();
  249.             ready();
  250.             strcpy( str, HelpM9 );
  251.             putmessage();
  252.             ready();
  253.             strcpy( str, HelpM10 );
  254.             putmessage();
  255.             ready();
  256.             strcpy( str, HelpM11 );
  257.             putmessage();
  258.             ready();
  259.             strcpy( str, HelpM12 );
  260.             putmessage();
  261.             ready();
  262.             PrgExit1();    /* メモリアロケーションを使っているから終了はこの関数を通してね */
  263.         }
  264. /*******************************************
  265.       if ( option & 1 )
  266.         {
  267.         strcpy( str, "flagld = 1" );
  268.         }
  269.     else
  270.         {
  271.         strcpy( str, "flagld = 0" );
  272.         }
  273.     putmessage();
  274.     ready();
  275.     
  276.       if ( option & 2 )
  277.         {
  278.         strcpy( str, "flagsv = 1" );
  279.         }
  280.     else
  281.         {
  282.         strcpy( str, "flagsv = 0" );
  283.         }
  284.     putmessage();
  285.     ready();
  286.     
  287.       if ( option & 8 )
  288.         {
  289.         strcpy( str, "flaggofmt = 1" );
  290.         }
  291.     else
  292.         {
  293.         strcpy( str, "flaggofmt = 0" );
  294.         }
  295.     putmessage();
  296.     ready();
  297.     
  298.       if ( option & 4 )
  299.         {
  300.         strcpy( str, "flagunfmt = 1" );
  301.         }
  302.     else
  303.         {
  304.         strcpy( str, "flagunfmt = 0" );
  305.         }
  306.     putmessage();
  307.     ready();
  308.  
  309.       if ( option & 16 )
  310.         {
  311.         strcpy( str, "flagipt = 1" );
  312.         }
  313.     else
  314.         {
  315.         strcpy( str, "flagipt = 0" );
  316.         }
  317.     putmessage();
  318.     ready();
  319. *******************************************/    
  320.  
  321.     /* コピー プログラム スタート */
  322.     CopyPrgMain();
  323.  
  324.     /* 処理終了 */
  325.     PrgExit1();
  326. }
  327.  
  328. /************************************************************************
  329. 【プログラム終了処理】
  330.  
  331.         概要    プログラム を終了して DOS へ戻る。
  332.         用法    PrgExit?();
  333.         引数    無し
  334.         戻り値    無し
  335.         注意    メモリ アロケート ポインタ は DiskData を使用
  336. ************************************************************************/
  337.  
  338. void PrgExit1( void )
  339. {
  340.     /* 2HD 1.2M モード に設定 */
  341.     SetDiskDrvMode( FD0_DRVNO, TYPE_2HD_12 );
  342.     SetDiskDrvMode( FD1_DRVNO, TYPE_2HD_12 );
  343.  
  344.     /* メモリ 開放 */
  345.     free( DiskData );
  346.  
  347.     PrgExit2();
  348. }
  349.  
  350. void PrgExit2( void )
  351. {
  352.     /* プロセス 脱出 */
  353.     exit( 0 );
  354. }
  355.  
  356.  
  357. /************************************************************************
  358. 【コピープログラムメイン処理】
  359.  
  360.         概要    プロッピー ディスク の ディスク コピー を行う。
  361.         用法    CopyPrgMain();
  362.         引数    無し
  363.         戻り値    無し
  364.         注意    無し
  365. ************************************************************************/
  366.  
  367. void CopyPrgMain( void )
  368. {
  369.     uint    status;            /* ドライブ ステータス */
  370.     int        drvno;            /* コピー 先 デバイス 番号 */
  371.     int i;
  372.     
  373.   if ( option & 1 )
  374.     {
  375.     flagerr=1;
  376.     strcpy( str, " デ-タファイルを読み込みんでデュプリします" );
  377.     putmessage();
  378.     flagerr=0;
  379.     if ( select() == 1 ) 
  380.         {
  381.         flagerr=1;
  382.         strcpy( str, EndMsg );
  383.         putmessage();
  384.         ready();
  385.         return;
  386.         }
  387.     disktype = loaddata( DiskData );
  388.     if ( ( disktype > 0 ) && ( disktype < 4 ) )
  389.         {
  390.         flagerr=1;
  391.         strcpy( str, " デ-タファイルを読み込みました" );
  392.         putmessage();
  393.         flagerr=0;
  394.         ready();
  395.         }
  396.     else
  397.         {
  398.         flagerr=1;
  399.         strcpy( str, " デ-タファイルを読み込み出来ませんでした" );
  400.         putmessage();
  401.         ready();
  402.         flagerr=0;
  403.         strcpy( str, EndMsg );
  404.         putmessage();
  405.         ready();
  406.            return;
  407.         }
  408.     }
  409.   else
  410.       {    
  411.         for ( ;; ) 
  412.             {
  413.             /* ディスク セット メッセージ 表示 */
  414.             flagerr=1;
  415.             strcpy( str, InMstAMsg );
  416.             putmessage();
  417.             if ( select() == 1 ) 
  418.                 {    
  419.                 strcpy( str, EndMsg );
  420.                 putmessage();
  421.                 if ( select() == -1 ) 
  422.                     {
  423.                     return;
  424.                     }
  425.                 continue;
  426.                 }
  427.             flagerr=0;
  428.  
  429.             /* ステータス 読み込み */
  430.             DKB_rdstatus( FD0_DRVNO, &status );
  431.                 if ( status & 0x01 ) 
  432.                 {
  433.                 ErrMsgPutWord( ERRNOTDISK );        /* ドライブ ノット レディー */
  434.                 continue;
  435.                 }
  436.  
  437.             /* フォーマット タイプ チェック */
  438.             disktype = ChkFormatType( FD0_DRVNO );
  439.             if ( disktype == NG ) 
  440.                 {
  441.                 ErrMsgPutWord( ERRDISKSET );        /* ディスク 設定 エラー */
  442.                 continue;
  443.                 }
  444.             if ( disktype == TYPE_NOT ) 
  445.                 {
  446.                 ErrMsgPutWord( ERRDISKTYPE );        /* 未対応 ディスク エラー */
  447.                 continue;
  448.                 }
  449.  
  450.             /* モード 設定 */
  451.             if ( SetDiskDrvMode( FD0_DRVNO, disktype ) != 0 ) 
  452.                 {
  453.                 ErrMsgPutWord( ERRMODESET );        /* モード セット エラー */
  454.                 continue;
  455.                 }    
  456.  
  457.             /* フォーマット タイプ 表示 */
  458.             clrmessage();
  459.             flagerr=1;
  460.             strcpy( str, DiskTypeMsgTbl[disktype] );
  461.             putmessage();
  462.             flagerr=0;
  463.             /* マスタ- ディスク 読み込み */
  464.             if ( ReadDiskAll( FD0_DRVNO, DiskData, disktype ) == 0 ) 
  465.                 {
  466.                 break;    
  467.                 }
  468.             }        /*  <for end> */
  469.     }
  470.  
  471.     /* ディスク コピー */
  472.         
  473.   if ( option & 2 ) 
  474.     {
  475.     flagerr=1;
  476.     strcpy( str, " デ-タファイルを作成します" );
  477.     putmessage();
  478.     flagerr=0;
  479.     if ( select() == 1 ) 
  480.         {
  481.         flagerr=1;
  482.         strcpy( str, EndMsg );
  483.         putmessage();
  484.         flagerr=0;
  485.         ready();
  486.         return;
  487.         }
  488.     if ( savedata( DiskData )==0 )
  489.         {
  490.         flagerr=1;
  491.         strcpy( str, " デ-タファイルを作成しました" );
  492.         putmessage();
  493.         flagerr=0;
  494.         ready();
  495.         strcpy( str, EndMsg );
  496.         putmessage();
  497.         ready();
  498.         }
  499.     else
  500.         {
  501.         flagerr=1;
  502.         strcpy( str, " デ-タファイルの作成に失敗しました" );
  503.         putmessage();
  504.         flagerr=0;
  505.         strcpy( str, EndMsg );
  506.         putmessage();
  507.         ready();
  508.         }
  509.     return ;
  510.     }
  511.   else
  512.     {
  513.     if ( option & 1 )
  514.         {
  515.         drvno=FD0_DRVNO;
  516.         }
  517.     else
  518.         {
  519.         drvno = FD1_DRVNO;    /* B ドライブ 設定 */
  520.         }
  521.             
  522.         for ( ;; ) 
  523.             {
  524.             /* ディスク セット メッセージ 表示 */
  525.             strcpy( str, (drvno == FD0_DRVNO ? InCpyAMsg : InCpyBMsg) );
  526.             putmessage();
  527.             if ( select() == 1 ) 
  528.                 {
  529.                 flagerr=1;
  530.                 strcpy( str, EndMsg );
  531.                 putmessage();
  532.                 if ( select() == -1 ) 
  533.                     {
  534.                     return;
  535.                     }
  536.                 continue;
  537.                 }
  538.             flagerr=0;
  539.             /* シリンダ 0 シ-ク & リセット */
  540.             if ( DKB_restore( drvno ) != 0 ) {
  541.                 ErrMsgPutWord( ERRNOTDISK );        /* ドライブ ノット レディー */
  542.                 flagerr=1;
  543.                 continue;
  544.             }    
  545.  
  546.             /* モード 設定 */
  547.             if ( SetDiskDrvMode( drvno, disktype ) != 0 ) {
  548.                 ErrMsgPutWord( ERRMODESET );        /* モード セット エラー */
  549.                 flagerr=1;
  550.                 continue;
  551.             }
  552.             
  553.             if ( option & 8 )
  554.                 {
  555.                 if (option & 4)
  556.                     {
  557.                     i=0;
  558.                     }
  559.                 else
  560.                     {
  561.                     i=2;
  562.                     }
  563.                 }
  564.             else
  565.                 {
  566.                 if (option & 4 )
  567.                     {
  568.                     i=1;
  569.                     }
  570.                 else
  571.                     {
  572.                     i=0;
  573.                     }
  574.                 }
  575.                 
  576.             switch ( i )
  577.                 {
  578.                 case 0:
  579.                 
  580.                     /* フォーマット 実行確認表示 */
  581.                     strcpy( str, FormProcMsg );
  582.                     putmessage();
  583.                     if ( select() != 1 ) 
  584.                         {
  585.                         FormatFlg = TRUE;        /* フォーマット 実行 */
  586.                         clrmessage();
  587.                         flagerr=1;
  588.                         strcpy( str, "フォーマット&コピー中" );
  589.                         putmessage();
  590.                         flagerr=0;
  591.                         }
  592.                     else 
  593.                         {
  594.                         FormatFlg = FALSE;        /* フォーマット スキップ */
  595.                         clrmessage();
  596.                         flagerr=1;
  597.                         strcpy( str, "コピー中" );
  598.                         putmessage();
  599.                         flagerr=0;
  600.                         }
  601.                     break;
  602.                 case 1:
  603.                     FormatFlg = FALSE;        /* フォーマット スキップ */
  604.                     clrmessage();
  605.                     flagerr=1;
  606.                     strcpy( str, "コピー中" );
  607.                     putmessage();
  608.                     flagerr=0;
  609.                     break;
  610.                 case 2:
  611.                     FormatFlg = TRUE;        /* フォーマット 実行 */
  612.                     clrmessage();
  613.                     flagerr=1;
  614.                     strcpy( str, "フォーマット&コピー中" );
  615.                     putmessage();
  616.                     flagerr=0;
  617.                     break;
  618.                 default:
  619.                     FormatFlg = TRUE;        /* フォーマット 実行 */
  620.                     clrmessage();
  621.                     flagerr=1;
  622.                     strcpy( str, "フォーマット&コピー中" );
  623.                     putmessage();
  624.                     flagerr=0;
  625.                     break;
  626.                 
  627.                 }
  628.  
  629.             /* ディスク 書き込み */
  630.             if ( WriteDiskAll( drvno, DiskData, disktype ) != 0 ) {
  631.                 flagerr=1;
  632.                 continue;
  633.             }
  634.  
  635.             /* A ←→ B 変換 */
  636.             drvno = ( drvno == FD0_DRVNO ? FD1_DRVNO : FD0_DRVNO );
  637.         }
  638.     }
  639. }
  640.  
  641.  
  642. /************************************************************************
  643. 【ディスクモード設定】
  644.  
  645.         概要    ディスク ドライブ モード の設定を行う。
  646.         用法    SetDiskDrvMode( devno, sw );
  647.         引数    int        devno            : デバイス 番号
  648.                 int        sw                : TYPE_2HD_12
  649.                                         : TYPE_2DD_720
  650.                                         : TYPE_2DD_640
  651.         戻り値    int        0x0000            : 正常終了
  652.                         0x0002            : デバイス 番号 エラー
  653.                         0x8???            : ハード エラー
  654.                         NG                : その他の エラー
  655.         注意    無し
  656. ************************************************************************/
  657.  
  658. int SetDiskDrvMode( int devno, int sw )
  659. {
  660.     int        mode1,            /* モード 1 */
  661.             mode2;            /* モード 2 */
  662.  
  663.     /* モ-ド 設定 */
  664.     switch ( sw ) {
  665.         case TYPE_2HD_12:        /* 2HD 1.2M */
  666.             mode1 =    MODE1_12;    /* MFM 2HD 1024 */
  667.             mode2 = MODE2_12;    /* 2 ヘッド 8 セクタ */
  668.             break;
  669.  
  670.         case TYPE_2DD_720:        /* 2DD 720K */
  671.             mode1 =    MODE1_720;    /* MFM 2DD 512 */
  672.             mode2 = MODE2_720;    /* 2 ヘッド 9 セクタ */
  673.             break;
  674.  
  675.         case TYPE_2DD_640:        /* 2DD 640K */
  676.             mode1 =    MODE1_640;    /* MFM 2DD 512 */
  677.             mode2 = MODE2_640;    /* 2 ヘッド 8 セクタ */
  678.             break;
  679.  
  680.         default:
  681.             return NG;
  682.     }
  683.  
  684.     return DKB_setmode( devno, mode1, mode2 );
  685. }
  686.  
  687.  
  688. /************************************************************************
  689. 【ディスク読み込み】
  690.  
  691.         概要    ディスク の 全 トラック (シリンダ) 分の 読み込みを行う。
  692.         用法    ReadDiskAll( devno, buf, sw );
  693.         引数    int        devno            : デバイス 番号
  694.                 char    *buf            : 読み込み バッファ ポインタ
  695.                 int        sw                : TYPE_2HD_12
  696.                                         : TYPE_2DD_720
  697.                                         : TYPE_2DD_640
  698.         戻り値    int        0x0000            : 正常終了
  699.                         0x0002            : デバイス 番号 エラー
  700.                         0x8???            : ハード エラー
  701.                         NG                : その他の エラー
  702.         注意    無し
  703. ************************************************************************/
  704.  
  705. int ReadDiskAll( int devno, char *buf, int sw )
  706. {
  707.     int        cylno,            /* 読み込み シリンダ 番号 */
  708.             headno,            /* 読み込み ヘッド 番号 */
  709.             seccnt,            /* 読み込み セクタ 数 */
  710.             secnum,            /* 残り セクタ 数 */
  711.             maxcylinder,    /* シリンダ 最大数 */
  712.             sectorlen,        /* セクタ 長 */
  713.             retry,            /* エラー リトライ カウンタ */
  714.             ret;            /* 戻り値 */
  715.     uint    offset = 0;        /* 読み込み ポインタ オフセット */
  716.  
  717.     /* セクタ 数, セクタ レングス, シリンダ 数, 設定 */
  718.     switch ( sw ) {
  719.         case TYPE_2HD_12:        /* 2HD 1.2M */
  720.             seccnt = MAXSEC_12;
  721.             maxcylinder = MAXCYL_2HD;
  722.             sectorlen = SECLEN1024;
  723.             break;
  724.  
  725.         case TYPE_2DD_720:        /* 2DD 720K */
  726.             seccnt = MAXSEC_720;
  727.             maxcylinder = MAXCYL_2DD;
  728.             sectorlen = SECLEN512;
  729.             break;
  730.  
  731.         case TYPE_2DD_640:        /* 2DD 640K */
  732.             seccnt = MAXSEC_640;
  733.             maxcylinder = MAXCYL_2DD;
  734.             sectorlen = SECLEN512;
  735.             break;
  736.  
  737.         default:
  738.             return NG;
  739.     }
  740.  
  741.     for ( cylno = 0; cylno < maxcylinder; cylno++ ) {
  742.         retry = 0;
  743.         for ( headno = 0; headno < MAXHEAD; ) {
  744.             /* ディスク データ 読み込み */
  745.             if ( ( ret = DKB_read( devno, cylno, headno, 1,
  746.                                 seccnt, buf + offset, &secnum ) ) != 0 ) {
  747.                 if ( retry < RETRYMAX ) {        /* エラー リトライ */
  748.                     retry++;
  749.                     continue;
  750.                 }
  751.                 else {
  752.                     ErrMsgPutWord( ERRDISKREAD );    /* ディスク リード エラー */
  753.                     return ret;
  754.                 }
  755.             }
  756.             else {
  757.                 headno++;
  758.                 offset += sectorlen * seccnt;
  759.                 retry = 0;
  760.             }
  761.         }
  762.     }
  763.  
  764.     return 0;
  765. }
  766.  
  767.  
  768. /************************************************************************
  769. 【ディスク書き込み】
  770.  
  771.         概要    ディスク の 全 トラック (シリンダ) 分の 書き込みを行う。
  772.         用法    WriteDiskAll( devno, buf, sw );
  773.         引数    int        devno            : デバイス 番号
  774.                 char    *buf            : 書き込み バッファ ポインタ
  775.                 int        sw                : TYPE_2HD_12
  776.                                         : TYPE_2DD_720
  777.                                         : TYPE_2DD_640
  778.         戻り値    int        0x0000            : 正常終了
  779.                         0x0002            : デバイス 番号 エラー
  780.                         0x8???            : ハード エラー
  781.                         NG                : その他の エラー
  782.         注意    無し
  783. ************************************************************************/
  784.  
  785. int WriteDiskAll( int devno, char *buf, int sw )
  786. {
  787.     int        cylno,            /* 書き込み シリンダ 番号 */
  788.             headno,            /* 書き込み ヘッド 番号 */
  789.             seccnt,            /* 書き込み セクタ 数 */
  790.             secnum,            /* 残り セクタ 数 */
  791.             maxcylinder,    /* シリンダ 最大数 */
  792.             sectorlen,        /* セクタ 長 */
  793.             retry,            /* エラー リトライ カウンタ */
  794.             ret;            /* 戻り値 */
  795.     uint    offset = 0;        /* 書き込み ポインタ オフセット */
  796.  
  797.     /* セクタ 数, セクタ レングス, シリンダ 数, 設定 */
  798.     switch ( sw ) {
  799.         case TYPE_2HD_12:        /* 2HD 1.2M */
  800.             seccnt = MAXSEC_12;
  801.             maxcylinder = MAXCYL_2HD;
  802.             sectorlen = SECLEN1024;
  803.             break;
  804.  
  805.         case TYPE_2DD_720:        /* 2DD 720K */
  806.             seccnt = MAXSEC_720;
  807.             maxcylinder = MAXCYL_2DD;
  808.             sectorlen = SECLEN512;
  809.             break;
  810.  
  811.         case TYPE_2DD_640:        /* 2DD 640K */
  812.             seccnt = MAXSEC_640;
  813.             maxcylinder = MAXCYL_2DD;
  814.             sectorlen = SECLEN512;
  815.             break;
  816.  
  817.         default:
  818.             return NG;
  819.     }
  820.  
  821.     for ( cylno = 0; cylno < maxcylinder; cylno++ ) {
  822.         retry = 0;
  823.         for ( headno = 0; headno < MAXHEAD; ) {
  824.             if ( FormatFlg == TRUE ) {
  825.                 /* フォーマット データ 作成 */
  826.                 MakeFormData( cylno, headno, sw );
  827.                 /* トラック フォーマット */
  828.                 if ( ( ret = TrackFormat( devno, cylno, headno ) ) != 0 ) {
  829.                     if ( ret & 0x02 ) {
  830.                         ErrMsgPutWord( ERRPROTECT );    /* 書き込み禁止 */
  831.                         return ret;
  832.                     }
  833.                     else if ( ret & 0x01 ) {
  834.                         ErrMsgPutWord( ERRNOTDISK );    /* ドライブ ノット レディー */
  835.                         return ret;
  836.                     }
  837.                     else {
  838.                         if ( retry < RETRYMAX ) {        /* エラー リトライ */
  839.                             retry++;
  840.                             continue;
  841.                         }
  842.                         else {
  843.                             ErrMsgPutWord( ERRFORMAT );        /* フォ-マット エラ- */
  844.                             return ret;
  845.                         }
  846.                     }
  847.                 }
  848.             }
  849.  
  850.             /* データ ディスク 書き込み */
  851.             if ( ( ret = DKB_write( devno, cylno, headno, 1,
  852.                             seccnt, buf + offset, &secnum ) ) != 0 ) {
  853.                 if ( ret & 0x02 ) {
  854.                     ErrMsgPutWord( ERRPROTECT );    /* 書き込み禁止 */
  855.                     return ret;
  856.                 }
  857.                 else if ( ret & 0x01 ) {
  858.                     ErrMsgPutWord( ERRNOTDISK );    /* ドライブ ノット レディー */
  859.                     return ret;
  860.                 }
  861.                 else {
  862.                     if ( retry < RETRYMAX ) {        /* エラー リトライ */
  863.                         retry++;
  864.                         continue;
  865.                     }
  866.                     else {
  867.                         ErrMsgPutWord( ERRDISKWRITE );    /* ディスク ライト エラー */
  868.                         return ret;
  869.                     }
  870.                 }
  871.             }
  872.             else {
  873.                 headno++;
  874.                 offset += sectorlen * seccnt;
  875.                 retry = 0;
  876.              }
  877.         }
  878.     }
  879.  
  880.     return 0;
  881. }
  882.  
  883.  
  884. /************************************************************************
  885. 【1トラックフォーマット】
  886.  
  887.         概要    ディスク の 1 トラック (シリンダ) 分の フォーマット を行う。
  888.         用法    TrackFormat( devno, cylno, headno );
  889.         引数    int        devno            : デバイス 番号
  890.                 int        cylno            : シリンダ 番号
  891.                 int        headno            : ヘッド 番号
  892.         戻り値    int        0x0000            : 正常終了
  893.                         0x0002            : デバイス 番号 エラー
  894.                         0x8???            : ハード エラー
  895.         注意    フォ-マット データ は FormDataBuf を使用する
  896. ************************************************************************/
  897.  
  898. int TrackFormat( int devno, int cylno, int headno )
  899. {
  900.     union REGS        regs;
  901.     struct SREGS    sregs;
  902.     ushort            dsdata;
  903.     IntParaBlk        parablk;
  904.  
  905.     /* セグメント データ 読み込み */
  906.     _segread( &sregs );
  907.     dsdata = sregs.ds;
  908.  
  909.     /* 共用 バッファ アドレス 取得 DOS-Extender ファンクション */
  910.     regs.x.ax = 0x250d;
  911.     _int86x( 0x21, ®s, ®s, &sregs );
  912.  
  913.     /* フォーマット データ バッファ から 共用 バッファ へ データ コピー */
  914.     _movedata( (uint)dsdata, (uint)FormDataBuf,
  915.                     (uint)sregs.es, regs.x.dx, sizeof(FormDataBuf) );
  916.  
  917.     /* フォーマット ファンクション を DOS-Extender を介して発行 */
  918.     parablk.intno = 0x93;                        /* 割り込み番号 */
  919.     parablk.reax = (uint)(0x0a00 | devno);        /* BIOS ファンクション 番号 & デバイス 番号 */
  920.     regs.x.cx = (uint)cylno;                    /* シリンダ 番号 */
  921.     parablk.redx = (uint)(headno << 8);            /* ヘッド 番号 */
  922.     parablk.rds = (ushort)(regs.x.bx >> 16);    /* 共用 バッファ リアル セグメント */
  923.     regs.x.di = regs.x.bx & 0xffff;                /* 共用 バッファ リアル オフセット */
  924.     parablk.res = 0;                            /* 未使用 */
  925.     parablk.rfs = 0;
  926.     parablk.rgs = 0;
  927.  
  928.     regs.x.ax = 0x2511;                            /* リアル モード 割り込み発行 */
  929.     regs.x.dx = (uint)¶blk;                    /* パラメータ ブロック オフセット */
  930.     sregs.ds = sregs.ss;                        /* パラメータ ブロック セグメント */
  931.     _intdosx( ®s, ®s, &sregs );            /* int 21h ax = 2511h 実行 */
  932.  
  933.     if ( regs.h.ah <= 0x02 )
  934.         return (int)(regs.h.ah);
  935.     else
  936.         return (int)( (regs.x.cx | 0x8000) & 0xffff );
  937. }
  938.  
  939.  
  940. /************************************************************************
  941. 【フォーマットデータ作成】
  942.  
  943.         概要    1 トラック (シリンダ) 分の フォーマット データ 作成を行う。
  944.         用法    MakeFormData( cylno, headno, sw );
  945.         引数    int        cylno            : シリンダ 番号
  946.                 int        headno            : ヘッド 番号
  947.                 int        sw                : TYPE_2HD_12
  948.                                         : TYPE_2DD_720
  949.                                         : TYPE_2DD_640
  950.         戻り値    無し
  951.         注意    フォ-マット データ は FormDataBuf を使用する
  952. ************************************************************************/
  953.  
  954. void MakeFormData( int cylno, int headno, int sw )
  955. {
  956.     int            i;
  957.     int            secnum,
  958.                 secmax;
  959.     char        *p;
  960.     FORMPARA    *sec;
  961.  
  962.     /* 作成 セクタ 数 & セクタ 圧縮 データ 設定 */
  963.     switch ( sw ) {
  964.         case TYPE_2DD_640:        /* 2DD 640K */
  965.             secmax = MAXSEC_640;
  966.             sec = SecData512;
  967.             break;
  968.  
  969.         case TYPE_2DD_720:        /* 2DD 720K */
  970.             secmax = MAXSEC_720;
  971.             sec = SecData512;
  972.             break;
  973.  
  974.         case TYPE_2HD_12:        /* 2HD 1.2M */
  975.         default:
  976.             secmax = MAXSEC_12;
  977.             sec = SecData1024;
  978.             break;
  979.     }
  980.  
  981.     p = FormDataBuf;
  982.  
  983.     /* プレ アンブル データ 展開 */
  984.     for ( i = 0; i < PreAmblCnt; i++ ) {
  985.         memset( p, PreAmbl[i].fdata, PreAmbl[i].cnt );
  986.         p += PreAmbl[i].cnt;
  987.     }
  988.  
  989.     /* セクタ データ 展開 */
  990.     sec[3].fdata = cylno;    /* ID TRACK NUMBER */
  991.     sec[4].fdata = headno;    /* ID SIDE NUMBER */
  992.     for ( secnum = 0; secnum < secmax; secnum++ ) {
  993.         sec[5].fdata = secnum + 1;    /* ID SECTOR NUMBER */
  994.         for ( i = 0; i < SecData1024Cnt; i++ ) {
  995.             memset( p, sec[i].fdata, sec[i].cnt );
  996.             p += sec[i].cnt;
  997.         }
  998.     }
  999.  
  1000.     /* ポスト アンブル データ 展開 */
  1001.     memset( p, PosAmbl[0].fdata, PosAmbl[0].cnt );
  1002. }
  1003.  
  1004.  
  1005. /************************************************************************
  1006. 【フォーマットタイプチェック】
  1007.  
  1008.         概要    ディスク の フォ-マット タイプ を調べる。
  1009.         用法    ChkFormatType( devno );
  1010.         引数    int        devno            : デバイス 番号
  1011.         戻り値    int        TYPE_NOT        : 未対応 ディスク
  1012.                         TYPE_2HD_12        : 1.2M 2HD
  1013.                         TYPE_2DD_720    : 720K 2DD
  1014.                         TYPE_2DD_640    : 640K 2DD
  1015.                         NG                : ディスク エラー
  1016.         注意    シリンダ 2, ヘッド 0 の フォーマット チェック
  1017.                 セクタ ID を読みだして タイプ を決定する
  1018. ************************************************************************/
  1019.  
  1020. int ChkFormatType( int devno )
  1021. {
  1022.     DKB_SEC        secid[30];
  1023.     uint        mode1tmp,
  1024.                 mode2tmp,
  1025.                 cnt;
  1026.     int            flg,
  1027.                 ret;
  1028.  
  1029.     /* シリンダ 0 シ-ク & リセット */
  1030.     if ( DKB_restore( devno ) != 0 )
  1031.         return NG;
  1032.  
  1033.     /* シリンダ 2 シ-ク */
  1034.     if ( DKB_seek( devno, 2 ) != 0 )
  1035.         return NG;
  1036.  
  1037.     flg = FALSE;    /* フラグ クリア */
  1038.     for ( cnt = 0; cnt < ChkMode1Tbl_Size; cnt++ ) {
  1039.         /* ドライブ モード 仮設定 */
  1040.         DKB_setmode( devno, ChkMode1Tbl[cnt], 0x0208 );
  1041.  
  1042.         /* セクタ ID 取り出し */
  1043.         if ( ( ret = DKB_rdsecid( devno, 2, 0, &secid[0] ) ) == 0 ) {
  1044.             flg = TRUE;
  1045.             break;        /* 正常終了なら ループ 脱出 */
  1046.         }
  1047.         else if ( ret & 0x0003 ) {
  1048.             return NG;    /* ドライブ 異常終了 */
  1049.         }
  1050.     }
  1051.  
  1052.     /* 処理 フラグ チェック */
  1053.     if ( flg == FALSE )
  1054.         return NG;        /* セクタ ID 無し */
  1055.  
  1056.     /* ドライブ モード 取り出し */
  1057.     DKB_rdmode( devno, &mode1tmp, &mode2tmp );
  1058.  
  1059.     /* 30 セクタ 分の ID を 読む */
  1060.     for ( cnt = 0; cnt < 30; cnt++ ) {
  1061.         if ( DKB_rdsecid( devno, 2, 0, &secid[cnt] ) != 0 )
  1062.             return NG;
  1063.     }
  1064.  
  1065.     /* セクタ 数の チェック */
  1066.     flg = FALSE;    /* フラグ クリア */
  1067.     for ( cnt = 1; cnt < 30; cnt++ ) {
  1068.         if ( secid[0].secno == secid[cnt].secno ) {
  1069.             flg = TRUE;
  1070.             break;        /* 正常終了なら ループ 脱出 */
  1071.         }
  1072.     }
  1073.  
  1074.     /* 処理 フラグ チェック */
  1075.     if ( flg == FALSE )
  1076.         return NG;        /* セクタ 異常 */
  1077.  
  1078.     /* mode 1 作成 */
  1079.     mode1tmp &= 0xfc;
  1080.     mode1tmp |= (uint)(secid[0].seccnt);
  1081.  
  1082.     /* mode 2 作成 */
  1083.     mode2tmp &= 0xff00;
  1084.     mode2tmp |= cnt;
  1085.  
  1086.     /* フォーマット タイプ 選別 */
  1087.     if ( mode1tmp == MODE1_12 && mode2tmp == MODE2_12 ) {
  1088.         return TYPE_2HD_12;        /* 1.2M 2HD */
  1089.     }
  1090.     else if ( mode1tmp == MODE1_720 && mode2tmp == MODE2_720 ) {
  1091.         return TYPE_2DD_720;    /* 720K 2DD */
  1092.     }
  1093.     else if ( mode1tmp == MODE1_640 && mode2tmp == MODE2_640 ) {
  1094.         return TYPE_2DD_640;    /* 640K 2DD */
  1095.     }
  1096.  
  1097.     return TYPE_NOT;    /* 未対応 ディスク */
  1098. }
  1099.  
  1100.  
  1101. /* end of file */
  1102.